import os
from openai import OpenAI
from flask import Flask, request, jsonify, Response, stream_with_context
import time
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

client = OpenAI(api_key="sk-b8575714afad46d2a2cd5156aa11b6b5",
                base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")

messages = [{
    "role": "system",
    "content": [{
        "type":"text",
        "text": """
你是一位精通互动式教学的数学导师，专长于通过提问引导学生自主解决问题。你的核心原则是：

1. **用户对话过程中会上传图片，图片中一般包含1到多个数学题目，你需要理解这些题目并等待用户选择其中一道进行提问**
2. **当用户询问图片中的题目时你需要准确返回该题目在图片中的位置，返回一个能够框住这个题目的矩形位置和大小**
3. **绝不直接给出答案**
4. **每次只推进一个步骤**
5. **始终以问题结束回复**
6. **当推进到最终答案时无论用户是否知道具体原理都可以直接给出最终的计算过程并结束问题的探讨**

互动协议（必须严格遵守）：

第一阶段：问题分析
1. 识别题目涉及的1-2个核心概念
2. 提出验证性问题确认学生基础理解
   → "首先，我们需要明确[核心概念]，你能解释下这个概念吗？"

第二阶段：分步引导
1. 根据题目条件拆解关键步骤
2. 每个回合只聚焦一个步骤：
   a. 提出该步骤的引导问题
   b. 根据学生回答：
      - 正确 → 推进到下一步
      - 部分正确 → 先肯定后引导修正
      - 错误 → 用更简单的类比问题重构理解,必要时可以提出更简单的类比问题并加以解释
3. 必须用开放式问题结束每次回复

第三阶段：总结验证
1. 当学生给出最终答案时：
   a. 要求解释推导过程
   b. 提出变式问题验证真正理解
                """
    }]
}]

@app.route('/talktorobot', methods=['POST'])
def talktorobot():
    data = request.json
    if not data or 'msg' not in data:
        return jsonify({'error': 'Missing required fields'}), 400
    
    img_url = data.get('img_url', '')
    msg = data.get('msg', '')
    
    if msg != '':
        if img_url != '':
            messages.append({   
                "role": "user",
                "content":[
                    {
                        "type":"image_url",
                        "image_url": {
                            "url": img_url
                        }
                    },
                    {"type":"text","text":msg+",并将题目在图片上标识出来，如果题目有选项请标记出正确选项。"}
                ]
            })
        else:
            messages.append({
                "role": "user",
                "content":[
                    {"type":"text","text":msg}
                ]
            })
        
        completion = client.chat.completions.create(
            model="qwen-omni-turbo",
            messages=messages,
            modalities=["text"],
            audio={"voice": "Chelsie", "format": "wav"},
            stream=True,
            stream_options={
                "include_usage": True
            }
        )
        
        def generate():
            for chunk in completion:
                if chunk.choices:
                    yield f"data: {chunk.choices[0].delta}\n\n"
                else:
                    yield f"data: {chunk.usage}\n\n"            
        
        return Response(stream_with_context(generate()), mimetype='text/event-stream')
    
    return jsonify({'error': 'Missing required fields'}), 400    


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)